<?php
//Класс для работы с файлами
class Filer {
    //Ограничения на картинки: по расширению файла, его реальному типу и по размеру (5Мб)
    //static private $img_available_type = array('image/jpeg', 'image/gif', 'image/png', 'image/pjpeg');
    //static private $img_max_size = 1048576;
    //static private $img_available_extension = array('jpg', 'jpeg', 'png', 'gif');
    //static private $img_big_size = 500;
    //static private $img_small_size = 100;
    
    //По имени файла получаем его расширение
    static function getExtention($file_name) {
        $out = array();
        preg_match('/\S*\.(\S+)$/', $file_name, $out);      
        $extension = '';
        if (isset($out[1])) $extension = $out[1];
        return strtolower($extension);
    }
    
    //Генерируем уникальное имя файла, сохраняя расширение исходного файла если он указан
    static function genFileName($old_file_name = FALSE) {
    	$file_name = md5(uniqid(rand(), TRUE));
		if ($old_file_name) {
			$file_name .= '.'.Filer::getExtention($old_file_name);
		}	  
    	return $file_name;
    }
	
	//Копируем временный файл во временное (но наше :) ) хранилище
	static function copyFromTemp($tmp_name, $file_name) {
        $new_name = Filer::genFileName($file_name);
        copy($tmp_name, Path::temp_files($new_name));
		return $new_name;
	}
	
	
    /*
    static function parseName($file_name) {
        return explode('.', $file_name);
    }*/
    
    //Тип картинки
    /*static function getImageType($file_name) {
        $size = getimagesize($file_name);
        return $size['mime'];
    }
    */
    /*static public function saveImage($file_name, $type, $size, $tmp_name, $img_params, &$error) {
        $extention = Filer::getExtention($file_name);
        
        //Какая-то ошибка
        if (!$tmp_name) {
            $error = 'general';
            return FALSE;
        }
        
        $type_2 = Filer::getImageType($tmp_name);
        
        //Если формат файла отличается от поддерживаемых форматов изображений
        if(!in_array($type, Filer::$img_available_type) || !in_array($extention, Filer::$img_available_extension) || !in_array($type_2, Filer::$img_available_type)) { 
           $error = 'wrong_image_format';
           return FALSE;
        }
        
        //Проверка на максимально допустимый размер 
        if($file['size'] > $max_size) {
           $error = 'file_too_big';
           return FALSE;
        }

        //Генерируем уникальное имя файла и сохраняем файл
        $system_name = Filer::genFileName().'.'.$extention;
        if (!Filer::createImage($tmp_name, Config::get('image_path').'/b_'.$system_name, $img_params['big_x'], $img_params['big_y'])) {
            $error = 'general';
            return FALSE;
        }
        
        //Создаём так же маленькую копию для превью, если нужно
        if (isset($img_params['small_x']))
            Filer::createImage($tmp_name, Config::get('image_path').'/s_'.$img_params['small_x'], $img_params['small_y']);
        
        return $system_name;
    }
    */
	
    //Функция пересохраняет изображение в новом месте, маштабируя его
    static function createImage($file_name, $new_file_name, $max_width = 0, $max_height = 0) {
		$size = getimagesize($file_name);
        if (!$size) return false;
        
        //В зависимости от формта файла нужно выбрать соответсвующую php-функцию
        $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
        $icfunc = 'imagecreatefrom'.$format;
        $iwfunc = 'image'.$format;
        
        if (!function_exists($icfunc) || !function_exists($iwfunc)) return false;
        
        //Вычисляем по какому из двух направлений нужно сильнее сжать картинку,
        //чтобы соответствовать ограничениям
        $x_ratio = $max_width / $size[0];
        $y_ratio = $max_height / $size[1];
		
		//Если 0 значит сжимать не нужно
		if ($x_ratio == 0) $x_ratio = 1;
		if ($y_ratio == 0) $y_ratio = 1;
		
        $ratio = min($x_ratio, $y_ratio);
        
        $new_width = floor($size[0] * $ratio);
        $new_height = floor($size[1] * $ratio);
        
        //Создаём новую картинку и копирую в неё старую, изменяя размер
        $src = $icfunc($file_name);
        
        $dest = imagecreatetruecolor($new_width, $new_height);
        
        //Обеспечиваем корректную работу с прозрачностью
        if ($format == 'png' || $format == 'gif') {
            imagealphablending($dest, FALSE); 
            imagesavealpha($dest, TRUE);
        }
        
        imagecopyresampled($dest, $src, 0, 0, 0, 0, $new_width, $new_height, $size[0], $size[1]);
        
        if ($format == 'jpeg')
            $iwfunc($dest, $new_file_name, 100);
        else if ($format == 'png')
            $iwfunc($dest, $new_file_name, 0);
        else
            $iwfunc($dest, $new_file_name);

        //Удаляем картинки из памяти, они могут занимать много места
        imagedestroy($src);
        imagedestroy($dest);
        
        return true;
    }
	
	static function delete($file) {
		 @unlink($file);
	}
    	
    //Удаление картинки
	/*
    static function deleteImage($file) {
        unlink(Config::get('image_path').'/s_'.$file);
        unlink(Config::get('image_path').'/b_'.$file);
    }*/
}
?>